跳到主要内容

Julia 特征

特征是一种多分派语言中的设计模式,旨在类型树以外将类型分组,以实现自由的多分派。

特征的定义由三部分组成,并且可以用 SimpleTraits.jl 简化。

特征类型

一系列 Julia 单例类型,表示一种特征;

abstract type StatQualia end

struct Continuous <: StatQualia end
struct Ordinal <: StatQualia end
struct Categorical <: StatQualia end
struct Normable <: StatQualia end

特征函数

将其他类型映射为这些单例类的实例

statqualia(::Type{<:AbstractFloat}) = Continuous()
statqualia(::Type{<:Integer}) = Ordinal()

statqualia(::Type{<:Bool}) = Categorical()
statqualia(::Type{<:AbstractString}) = Categorical()

statqualia(::Type{<:Complex}) = Normable()

派发函数

对于一个要计算的函数,首先提取类型并计算输入的特征,然后根据特征分配给函数的其他方法

using LinearAlgebra

## This is the trait re-dispatch; get the trait from the type
bounds(xs::AbstractVector{T}) where T = bounds(statqualia(T), xs)

## These functions dispatch on the trait
bounds(::Categorical, xs) = unique(xs)
bounds(::Normable, xs) = maximum(norm.(xs))
bounds(::Union{Ordinal, Continuous}, xs) = extrema(xs)